package com.uuzz.lottery.agent.gateway.base;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 类 名: FilterChainImpl
 * 描 述: 调用参数过滤器
 * 作 者: liuqing
 * 创 建： 2015年5月6日
 * 版 本：
 * @param <I> 输入参数
 * @param <O> 输出参数
 * 历 史: (版本) 作者 时间 注释
 */
public class FilterChainImpl<I,O> implements IFilterChain<I,O>{
	
	/**
	 * 构造
	 * @param call 过滤的调用器
	 */
	public FilterChainImpl(AbstractFilterCall<I,O> call){
		this.call = call;
	}
	
	/**
	 * 
	 */
	private AbstractFilterCall<I,O> call;
	/**
	 * 过滤器
	 */
	private final List<IFilter<I,O>> filters = new ArrayList<IFilter<I,O>>();
	
	private static final Integer beginIndex = 0;
	
	private ThreadLocal<Integer> indexOfChainThreadLocal = new ThreadLocal<Integer>(){
		@Override
		protected Integer initialValue() {
			return beginIndex;
		}
		
	};
	
	@Override
	public void doFilter(I in, O out) {
		final int size = filters.size();
		final int indexOfChain = indexOfChainThreadLocal.get();
		if(indexOfChain==size){
			call.doCall(in, out);
		}else{
			IFilter<I,O> filter = filters.get(indexOfChain);			
			try{
				indexOfChainThreadLocal.set(indexOfChain+1);
				filter.doFilter(in, out, this);
			}finally{
				indexOfChainThreadLocal.set(indexOfChain);
			}
		}
	}
	
	/**
	 * 
	 * 描 述：增加过滤器
	 * 作 者：liuqing
	 * 历 史: (版本) 作者 时间 注释 
	 * @param filter 过滤器
	 */
	void addFilter(IFilter<I,O> filter){
		filters.add(filter);
	}

}
